home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software of the Month Club 1996 June
/
Software of the Month Club 1996 June.iso
/
pc
/
dos
/
dtp
/
display
/
drvsrc
/
vesa
/
pieces
/
vesainfo.c
< prev
Wrap
Text File
|
1994-03-20
|
6KB
|
166 lines
/**
** VESAINFO.H ---- routines to retrieve info from the VESA BIOS
**
** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
** Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
** Copyright (C) 1993 Grzegorz Mazur, gbm@ii.pw.edu.pl
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**/
/*
* VESA BIOS extended function number and return code
*/
#define VESA_FUNC 0x4f00
#define VESA_SUCCESS 0x004f
#define VESA_VERSION(major,minor) ((((major) & 0xff) << 8) | ((minor) & 0xff))
#define VESA_VERSION_MAJOR(vers) (((vers) >> 8) & 0xff)
#define VESA_VERSION_MINOR(vers) ((vers) & 0xff)
/*
* VESA BIOS sub-function numbers
*/
#define VESA_VGA_INFO 0 /* get VGA adapter info */
#define VESA_MODE_INFO 1 /* get SVGA mode info */
#define VESA_SET_MODE 2 /* set video mode */
#define VESA_GET_MODE 3 /* get current video mode */
#define VESA_VGA_STATE 4 /* save/restore VGA state */
#define VESA_PAGE_CTL 5 /* memory control */
/* VESA 1.1 +++ */
#define VESA_SCAN_LNLEN 6 /* set/get scan line length */
#define VESA_DISP_START 7 /* set/get display start address */
/* VESA 1.2 +++ */
#define VESA_PAL_CNTRL 8 /* DAC palette control */
/*
* The VGA info structure (without padding)
*/
typedef struct {
char VESASignature[4]; /* should be "VESA" */
short VESAVersion; /* VESA version number */
char far *OEMStringPtr; /* Pointer to OEM string */
long Capabilities; /* capabilities of the video env */
short far *VideoModePtr; /* ptr to supported Super VGA modes */
} VgaInfoBlock;
/*
* The mode information structure (without padding)
*/
typedef struct {
short ModeAttributes; /* mode attributes */
char WinAAttributes; /* Window A attributes */
char WinBAttributes; /* Window B attributes */
short WinGranularity; /* window granularity */
short WinSize; /* window size */
unsigned short WinASegment; /* Window A start segment */
unsigned short WinBSegment; /* Window B start segment */
void far (*WinFuncPtr)(); /* pointer to window function */
short BytesPerScanLine; /* bytes per scan line */
/*
* extended information
* optional information
*/
short XResolution; /* horizontal resolution */
short YResolution; /* vertical resolution */
char XCharSize; /* character cell width */
char YCharSize; /* character cell height */
char NumberOfPlanes; /* number of memory planes */
char BitsPerPixel; /* bits per pixel */
char NumberOfBanks; /* number of banks */
char MemoryModel; /* memory model type */
char BankSize; /* bank size in K */
char NumImagePages; /* number of image pages */
char reserved[1];
/*
* VESA 1.2 and later
*/
char RedMaskSize; /* number of bits in red mask */
char RedMaskPos; /* starting bit for red mask */
char GreenMaskSize;
char GreenMaskPos;
char BlueMaskSize;
char BlueMaskPos;
char ReservedMaskSize; /* reserved bits in pixel */
char ReservedMaskPos;
char DirectScreenMode;
} ModeInfoBlock;
/*
* MODE attribute bits
*/
#define MODE_SUPPORTED 1 /* Mode supported in hardware */
#define MODE_EXTINFO 2 /* Extended information available */
#define MODE_SUPBIOS 4 /* Text output supported by BIOS */
#define MODE_ISCOLOR 8 /* Monochrome/color mode */
#define MODE_ISGRAPHICS 16 /* Mode type (0: text, 1:graphics) */
/*
* Window attribute bits
*/
#define WIN_SUPPORTED 1 /* Window supported */
#define WIN_READABLE 2 /* Window readable */
#define WIN_WRITABLE 4 /* Window writable */
/*
* MemoryModel values
*/
#define MODEL_TEXT 0 /* 00h = Text mode */
#define MODEL_CGA 1 /* 01h = CGA graphics */
#define MODEL_HERC 2 /* 02h = Hercules graphics */
#define MODEL_4PLANE 3 /* 03h = 4-plane planar */
#define MODEL_PACKED 4 /* 04h = Packed pixel */
#define MODEL_256_NC 5 /* 05h = Non-chain 4, 256 color */
#define MODEL_DIRECT 6 /* 06h = direct color mode */
/* 07h-0Fh = Reserved, to be defined by VESA */
/* 10h-FFh = To be defined by OEM */
union {
VgaInfoBlock _vgainfo;
char _safety_buffer[270];
} VESAVgaInfoBlock = {0};
union {
ModeInfoBlock _modeinfo;
char _safety_buffer[270];
} VESAModeInfoBlock = {0};
int VESAversion = 0;
VgaInfoBlock *VESAgetInfo(void)
{
_ES = FP_SEG(&VESAVgaInfoBlock._vgainfo);
_DI = FP_OFF(&VESAVgaInfoBlock._vgainfo);
_AX = VESA_FUNC + VESA_VGA_INFO;
geninterrupt(0x10);
if((_AX == VESA_SUCCESS) &&
(VESAVgaInfoBlock._vgainfo.VESASignature[0] == 'V') &&
(VESAVgaInfoBlock._vgainfo.VESASignature[1] == 'E') &&
(VESAVgaInfoBlock._vgainfo.VESASignature[2] == 'S') &&
(VESAVgaInfoBlock._vgainfo.VESASignature[3] == 'A')) {
VESAversion = VESAVgaInfoBlock._vgainfo.VESAVersion;
return(&VESAVgaInfoBlock._vgainfo);
}
return(0);
}
ModeInfoBlock *VESAgetModeInfo(int mode)
{
_ES = FP_SEG(&VESAModeInfoBlock._modeinfo);
_DI = FP_OFF(&VESAModeInfoBlock._modeinfo);
_CX = mode;
_AX = VESA_FUNC + VESA_MODE_INFO;
geninterrupt(0x10);
if(_AX != VESA_SUCCESS) return(0);
if((VESAModeInfoBlock._modeinfo.ModeAttributes & MODE_SUPPORTED) == 0) return(0);
return(&VESAModeInfoBlock._modeinfo);
}